/* 
    插入：  首先：判断插入的长度，新建新的node ，然后  分首部和其他
    首部： 1. 新node.next接收旧node      其他：1. 寻找的前一个node
                                            2. 新node.next接收所找的node.next
                                            3. 找到的node.next接收新node
           2\4. 长度加一
*/
/*
    删除： 首先：判断插入的长度（length=0），然后   分首部和其他
    首部： 1. 新建变量接收删除的值          其他：1. 寻找的前一个node
          2. node直接接收node.next值          2. 找到的node接收找到的node的node.next.next
          3\3. 长度减一                         
*/

// 一个节点
class Node {
  constructor(item, next = null) {
    this.item = item;
    this.next = next;
  }
}

// 一个链表
class List {
  // 初始化链表
  constructor() {
    this.node = null;
    this.length = 0;
  }

  // 返回查找的节点
  findPos(pos) {
    let r = this.node;
    for (let i = 0; i < pos; i++) {
      r = r.next; // 返回下一个新的节点
    }
    return r;
  }

  set(item, pos) {
    if (pos < 0 || pos > this.length) {
      return false;
    }
    let newNode = new Node(item);
    if (pos == 0) {
      newNode.next = this.node;
      this.node = newNode;
      this.length++;
      return true;
    }

    let r = this.node;
    for (let i = 0; i < pos - 1; i++) {
      r = r.next;
    }
    newNode.next = r.next;
    r.next = newNode;
    this.length++;
    return true;
  }

  delect(pos) {
    if (pos < 0 || pos >= this.length) {
      return false;
    }

    //
    if (pos == 0) {
      let temp = this.node;
      this.node = temp.next;
      this.length--;
      return temp.item;
    }

    let r = this.findPos(pos - 1);
    let temp = r.next;
    r.next = r.next.next;
    this.length--;
    return temp.item;
  }

  //   // 固定位置插入元素
  //   insert(item, pos) {
  //     // 是否合法
  //     if (pos < 0 || pos > this.length) {
  //       return false;
  //     }
  //     // 新建节点
  //     // 一个链表的节点，实际上是一个节点里面包含多个节点，用next一个个包含的
  //     let list = new Node(item); // list->node\next
  //     // 节点为头结点
  //     if (pos == 0) {
  //       // 新节点的指针等与旧结点
  //       list.next = this.node;
  //       this.node = list;
  //       this.length++;
  //       return true;
  //     }
  //     // 不为头结点
  //     // 找到该节点前一个
  //     let pre = this.findPos(pos - 1);
  //     list.next = pre.next;
  //     pre.next = list;
  //     this.length++;
  //     return true;
  //   }
}

let l = new List();

// l.insert(10, 0);
// l.insert(20, 0);
// l.insert(30, 1);

console.log(l.set(10, 0));
console.log(l.set(20, 0));
console.log(l.set(30, 1));
console.log(l);
// console.log(l.delect(0));
console.log(l.delect(2));
